package it.pizzastorm.domain.geolocalizzazione;


public class GeolocalizzazioneUtils {
	public final static double DIAMETRO_TERRA_APPROX_IN_METRI = 40043000d;

	private GeolocalizzazioneUtils() {
	}
	
/*	
	public static <K extends Geolocalizzato> List<K> filtraEdOrdina(Posizione centro, Collection<K> punti, double distanzaInMetri) {
		List<Geolocalizzato> res= new ArrayList<Geolocalizzato>();
		for(K punto:punti){
			if(getDistanzaInMetri(centro, punto)<=distanzaInMetri){
				res.add(punto);
			}
		}
		Collections.sort(res, new Comparator<Posizione>() {
		});
	}
	*/
	public static double getDistanzaInMetri(Posizione puntoA, Posizione puntoB) {
		double theta = puntoA.getLongitudine()
				.subtract(puntoB.getLongitudine()).doubleValue();
		double dist = Math.sin(deg2rad(puntoA.getLatitudine().doubleValue()))
				* Math.sin(deg2rad(puntoB.getLatitudine().doubleValue()))
				+ Math.cos(deg2rad(puntoA.getLatitudine().doubleValue()))
				* Math.cos(deg2rad(puntoB.getLatitudine().doubleValue()))
				* Math.cos(deg2rad(theta));
		dist = Math.acos(dist);
		dist = rad2deg(dist);
		return Math.abs(dist * 60 * 1.1515 * 1609.344);
	}

	/**
	 * Converte un angolo da gradi a radianti
	 * 
	 * @param deg
	 *            i gradi da convertire
	 * @return i radianti convertiti
	 */
	public static double deg2rad(double deg) {
		return (deg * Math.PI / 180.0);
	}

	/**
	 * Converte un angolo da radianti a gradi
	 * 
	 * @param rad
	 *            i radianti da convertire
	 * @return i gradi convertiti
	 */
	public static double rad2deg(double rad) {
		return (rad * 180.0 / Math.PI);
	}

}
